import os
import re
from typing import Optional

def validate_path(path: str) -> bool:
    """验证路径是否有效
    
    Args:
        path: 要验证的路径
    
    Returns:
        路径是否有效
    """
    try:
        # 检查路径是否存在
        if not os.path.exists(path):
            return False
        
        # 检查路径是否可访问
        if not os.access(path, os.R_OK):
            return False
        
        return True
    except Exception:
        return False

def validate_depth(depth: int) -> bool:
    """验证深度参数是否有效
    
    Args:
        depth: 深度值
    
    Returns:
        深度是否有效
    """
    return isinstance(depth, int) and depth > 0 and depth <= 20

def is_valid_filename(filename: str) -> bool:
    """验证文件名是否有效
    
    Args:
        filename: 文件名
    
    Returns:
        文件名是否有效
    """
    # Windows文件名不能包含的字符
    invalid_chars = re.compile(r'[<>"/\\|?*]')
    if invalid_chars.search(filename):
        return False
    
    # 文件名不能为空且不能过长
    if not filename or len(filename) > 255:
        return False
    
    # 不能是保留文件名
    reserved_names = {'CON', 'PRN', 'AUX', 'NUL', 
                      'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9',
                      'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9'}
    
    name_without_ext = filename.split('.')[0].upper()
    if name_without_ext in reserved_names:
        return False
    
    return True

def sanitize_filename(filename: str) -> str:
    """清理文件名中的无效字符
    
    Args:
        filename: 原始文件名
    
    Returns:
        清理后的文件名
    """
    # 替换无效字符
    valid_filename = re.sub(r'[<>"/\\|?*]', '_', filename)
    
    # 截断过长的文件名
    if len(valid_filename) > 255:
        # 保留扩展名
        name_parts = valid_filename.rsplit('.', 1)
        if len(name_parts) == 2:
            name, ext = name_parts
            valid_filename = name[:255 - len(ext) - 1] + '.' + ext
        else:
            valid_filename = valid_filename[:255]
    
    return valid_filename